/**
 * @file rscApplication.h
 * @brief Definizioni delle strutture dati e delle funzioni per gestire le risorse applicative.
 *
 * Complete description of this file.
 *
 * @date Mar 16, 2012
 * @author Francesco Corvino
 */

#ifndef RSCAPPLICATION_H_
#define RSCAPPLICATION_H_

#include "../MemObj/cmap.h"
#include "../MemObj/executionObj.h"
#include "factoryComm.h"

/**
 * @brief Definisce i dati dell'applicazione.
 *
 * Esiste una sola istanza di quest'oggetto. Il controllo di quest'istanza
 * viene gestito principalmente dall'invoker, ma i comandi possono farne richiesta
 * per modificarne alcuni valori.
 */
typedef struct {
	CMap attributes;

	/**
	 * @brief Array di comandi registrati nell'applicazione.
	 */
	DynArray commands;

	CMap requests;

	CMap hostSession;
} Application;

#define APPLICATION_HISTORY_KEY 3

Application * RscApp_init();

//Application * RscApp_get();

/////////////////////////////////////////////////////////////////////////////////////////
/////// Funzioni per la gestione degli attributi ////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

void RscApp_setAttribute(void * elem, const int key, size_t size);

void* RscApp_getAttribute(const int key);

/////////////////////////////////////////////////////////////////////////////////////////
/////// Funzioni per la gestione dei comandi e delle richieste //////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

DynArray* RscApp_getCommands();

void RscApp_addCommand(InterfaceCommand * cmd);

void RscApp_delCommand(InterfaceCommand * cmd);

UserRequest * RscApp_getRequest(int keySession);

void RscApp_updateRequest(UserRequest * req, int keySession);

/////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per gestire le sessioni /////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

CMap * RscApp_getAllSession();

#endif /* RSCAPPLICATION_H_ */
